/*
 *  Copyright 2013 HCIWriter
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package com.hci.writer.client.activity;

import com.google.gwt.activity.shared.AbstractActivity;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.place.shared.Place;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.hci.writer.client.ClientFactory;
import com.hci.writer.client.Storage;
import com.hci.writer.client.place.WritePlace;
import com.hci.writer.client.ui.WriteView;
import com.hci.writer.shared.ExerciseStep;
import com.hci.writer.shared.Task;

public class WriteActivity extends AbstractActivity implements WriteView.Presenter {

	private ClientFactory clientFactory;
	private Task task;
	
	public WriteActivity(WritePlace place, ClientFactory clientFactory) {
        this.task = place.getTask();
		
        this.clientFactory = clientFactory;
    }

	@Override
	public void start(AcceptsOneWidget containerWidget, EventBus eventBus) {
		WriteView writeView = clientFactory.getWriteView();
		writeView.setPresenter(this);
		writeView.init(this.task);
        containerWidget.setWidget(writeView.asWidget());
	}
	
    @Override
    public String mayStop() {
        return "Wollen Sie diese Aufgabe wirklich abschließen?";
    }
	
	@Override
	public void goTo(Place place) {
		clientFactory.getPlaceController().goTo(place);
	}

	@Override
	public void processKeystroke(String newText, int cursorPos, int selectionLength) {
		ExerciseStep es = new ExerciseStep();
		
		int newTextLength = newText.length();
		
		// Search things from begin
		while(es.contentBegin < this.task.oldTextLength && 
				es.contentBegin < newTextLength && 
				this.task.oldText.charAt(es.contentBegin) == newText.charAt(es.contentBegin)) {
			++es.contentBegin;
		}

		// Search things from end
		while(es.contentEnd < this.task.oldTextLength &&
				es.contentBegin + es.contentEnd < newTextLength &&
				newText.charAt(newTextLength-es.contentEnd-1) == this.task.oldText.charAt(this.task.oldTextLength-es.contentEnd-1)) {
			++es.contentEnd;
		}
		
		// Added
		if(es.contentBegin != newTextLength) {
			es.contentGap = newText.substring(es.contentBegin, newTextLength-es.contentEnd);
		}
		
		es.cursor = cursorPos;
		es.selectionLength = selectionLength;

		this.task.oldText = newText;
		this.task.oldTextLength = newTextLength;
		
		this.task.steps.add(es);
	}

	@Override
	public void finishExercise() {
		goTo(Storage.placeStack.poll());
	}

}
